package LeetCode._01算法入门.day06滑动窗口;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author 挚爱之夕
 * @date 2022-02-25 - 02 - 25 - 20:24
 * @Description 给你两个字符串s1和s2，写一个函数来判断s2是否包含s1的排列。
 * 如果是，返回 true 否则 返回 false
 * 换句话说，s1 的排列之一是s2的子串
 * s1 和 s2 仅包含小写字母
 * @Version 中等
 */
public class _567字符串的排列 {
    static String s1 = "ab";
    static String s2 = "eidbaooo";
    @Test
    public void solve(){
        boolean res = checkInclusion(s1, s2);
        System.out.println(res);
    }
    //滑动窗口
    public boolean checkInclusion(String s1, String s2) {
        int n = s1.length(), m = s2.length();
        if (n > m) {
            return false;
        }
        //存放s1小写字母出现次数
        int[] cnt1 = new int[26];
        //存放s2中 n 区间 小写字母出现次数
        int[] cnt2 = new int[26];
        //统计下标 0 - n s1、s2 中小写字母出现的次数
        for (int i = 0; i < n; ++i) {
            ++cnt1[s1.charAt(i) - 'a'];
            ++cnt2[s2.charAt(i) - 'a'];
        }
        if (Arrays.equals(cnt1, cnt2)) {
            return true;
        }
        //这个窗口向右移动
        for (int i = n; i < m; ++i) {
            ++cnt2[s2.charAt(i) - 'a'];
            --cnt2[s2.charAt(i - n) - 'a'];
            if (Arrays.equals(cnt1, cnt2)) {
                return true;
            }
        }
        return false;
    }
}
